	<script type="text/javascript">
	function pasarVariables(pagina, nombres) {
  pagina +="?";
  nomVec = nombres.split(",");
  for (i=0; i<nomVec.length; i++)
    pagina += nomVec[i] + "=" + escape(eval(nomVec[i]))+"&";
  pagina = pagina.substring(0,pagina.length-1);
  location.href=pagina;
}
</script>
<div class="content clear-block">
	<h2>Cap&iacute;tulo 6 Administraci&oacute;n de usuarios.</h2>
<br />
<p class="definicion" align="justify">
&nbsp;&nbsp;Una de las principles funciones de una administrador de bases de datos es la gestion de usuarios. Todos los usuarios que se conecten a la base de datos deben de poseer una cuenta y se deben de autenticar. 
<br /><br />
En este cap&iacute;tulo os voy a ense&ntilde;ar los diferentes pasos que debe de dar un administrador para configurar una cuenta de usuario:
<br /><br />
1) Crear una cuenta de usuario, utilizaremos el comando CREATE USER.
<br /><br />
2) Elegir metodo de autenticaci&oacute;n del usuario. Oracle ofrece varias formas de autenticarse:
<br /><br />
- Mediante un password:
<br /><br />
En este mentodo de autenticacion a la hora de conectarse el usuario proporcionara un password que se le proporciono al crear su cuenta.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
Sql> CREATE USER MiUser IDENTIFIED BY MiPass;
</p></pre></blockquote>
<p class="definicion" align="justify">
- Autenticacion externa:
<br /><br />
En este metodo de autenticaci&oacute;n Oracle comprueba si el usuario y la clave que ha proporcionado estan dados de alta en el sistema operativo.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
Sql> CREATE USER ops$oracle IDENTIFIED EXTERNALLY;
</p></pre></blockquote>
<p class="definicion" align="justify">
Para indicar que un usuario se va a autenticar de forma externa antepondremos en el nombre el prefijo ops$, podremos cambiar este prefijo en el fichero init.ora configurando el parametro OS_AUTHENT_PREFIX. Tambien habra que indicar con IDENTIFED EXTERNALLY que ese usuario se va a utenticar de forma externa.
<br /><br />
- Autenticacion global. 
<br /><br />
En este caso Oracle legara la autenticacion del ususario a sistemas externos como Kerberos o Radius.
<br /><br />
3) Asignarle al usuario un tablespace por defecto en el que se van a almacenar sus objetos de esquema. Esto lo podremos hacer en el momento de crear la cuenta:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
Sql> CREATE USER rajesh IDENTIFIED BY welcome DEFAULT TABLESPACE users;

O  ya una vez ya creada:

Sql> ALTER USER rajesh DEFAULT TABLESPACE users;
</p></pre></blockquote>
<p class="definicion" align="justify">
Sino indicamos un tablespace por defecto Oracle asignara al usuario el tablespace que la base de datos tenga por defecto. Para poder cambiar exte tablespace haremos:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
Sql> ALTER DATABASE DEFAULT TABLESPACE users;
</p></pre></blockquote>
<p class="definicion" align="justify">
En el proceso de asignacion de tablespaces, el administrador de base de datos puede configurar el tablespace temporal que va a utilizar ese usuario, como comentamos en cap&iacute;tulos anteriores un tablespaces temporar se utiliza para operaciones de ordenaci&oacute;n tales como GROUP BY o ORDER BY. es necesario utilizar un segmento temporal que se almacena en un tablespace temporal. Nos puede interesar  asignar a nuestro usuario un tablespace temporal que no sea el que tiene por defecto Oracle, para eso haremos:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
Sql> CREATE USER rajesh IDENTIFIED BY welcome
     DEFAULT TABLESPACE users
     TEMPORARY TABLESPACE temp;

Sql> ALTER USER rajesh
    TEMPORARY TABLESPACE temp;
</p></pre></blockquote>
<p class="definicion" align="justify">
Para poder cambiar el tablespace que Oracle tiene por defecto haremos:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
Sql> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;
</p></pre></blockquote>
<p class="definicion" align="justify">
4) Tambi&eacute;n es interesante configurar o asignar el perfil que va a tener ese usuario. Un perfil limitara el acceso a los recursos de la base de datos, asi como permitira asignar reglas para la gestion del password de ese usuario.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
Sql> CREATE USER jiang IDENTIFIED BY "kneehow.ma"
   DEFAULT TABLESPACE users
   TEMPORARY TABLESPACE temp
    PROFILE resource_profile;

Sql> ALTER USER hamish
    PROFILE resource_profile;
</p></pre></blockquote>
<p class="definicion" align="justify">
nota: Mas tarde comentar&eacute; como crear un perfil.
<br /><br />
5) Otra operaci&oacute;n que nos puede ser interesante a estas alturas es como poder borrar un usuario y todos sus objetos utilizaremos el siguiente comando:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
Sql>DROP USER jiang CASCADE;
</p></pre></blockquote>
<p class="definicion" align="justify">
nota: Este comando borrara todos los objetos del usuario, menos aquellos sobre los que otros usuarios tengan privilegios de administrador.
<br /><br />
6) Antes de crear un usurio tenemos que tener claro que privilegios le vamos a asignar, los privilegios permitiran acceder al usuario a determinados objetos de la base de datos, ejecutar programas almacenados o incluso asignar privilegios a otros usuarios.
<br /><br />
Oracle ofrece varios tipos de priveligos:
</p>
<blockquote>
a)	Privilegios de objetos: son los privilegios que limitan el acceso con los objetos de esquema.<br /><br />
b)	Privilegios de sistema: son privilegios a nivel de base de datos. Como por ejemplo conectarse, crear nuevos usuarios, recursos de sistema, etc.<br /><br />
</blockquote>
<p class="definicion" align="justify">
Tanto los privilegios de sistema como los privilegios de objeto se pueden agrupar en conjuntos llamados roles.
<br /><br />
PRIVILEGIOS DE OBJETO.
<br /><br />
Como hemos comentado, estos privilegios son los que afectan a los objetos de esquema.
<br /><br />
Existen privilegios con efectos comunes para determinados objetos tales como tablas, vistas. Algunos de estos privilegios son:
</p>
<blockquote>
	-- SELECT: permite hacer un select sobre el objeto.<br /><br />
	-- INSERT: permite hacer un insert sobre el objeto.<br /><br />
	-- UPDATE: permite hacer un update sobre el objeto.<br /><br />
	-- DELETE: permite hacer un delete sobre el objeto.<br /><br />
</blockquote>
<p class="definicion" align="justify">
Luego tenemos privilegios particulares para cada objeto. Por ejemplo:
<br /><br />
Para las tablas:
</p>
<blockquote>
	-- INDEX: Permiten crear indices sobre la tabla. Este indice pertenecera al usuario que lo cree.<br /><br />
	-- REFERENCES: Permite crear constrains sobre la tabla.<br /><br />
	-- ALTER: Permiten modificar la estructura de la tabla.<br /><br />
</blockquote>
<p class="definicion" align="justify">
El comando que permite asignar privilegios de objeto a un usuario es:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
Sql> GRANT SELECT,INSERT,UPDATE,DELETE ON customers TO sales_manager;
</p></pre></blockquote>
<p class="definicion" align="justify">
Este comando da los privilegios de SELECT, INSERT, UPDATE y DELETE al usuario sales_manager sobre la tabla customers.
<br /><br />
Existe un usuario especial en Oracle llamado public, que los privilegios que reciba public los heredaran automaticamente todos los usuarios de la base de datos.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
Sql> GRANT SELECT ON customers TO public;
</p></pre></blockquote>
<p class="definicion" align="justify">
Cuando asignamos un privilegio a un usuario, podemos querer que ese usuario a su vez pueda asignar ese privilegio a otros usuarios, para ello haremos:
</p>
<br /><blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
Sql> GRANT SELECT ON sales.customers TO sales_admin WITH GRANT OPTION;
</p></pre></blockquote>
<p class="definicion" align="justify">
PRIVILEGIOS DE SISTEMA
<br /><br />
Estos privilegios son los que van a permitir al usuario ejecutar sentencias DDL tales como CREATE, ALTER, DROP y sentencias DML. Los diferentes privilegios de sistema que puede recibir un usuario se pueden consultar en al tabla SYSTEM_PRIVILEGE_MAP.
<br /><br />
 Algunos privilegios de sistema que nos interesa son:
<br /><br />
- Database
</p>
<blockquote>
ALTER DATABASE <br />
ALTER SYSTEM
</blockquote>
<p class="definicion" align="justify">
- Indices
</p>
<blockquote>
[CREATE|ALTER|DROP] ANY INDEX: Permite al usuario crear o modificar o borrar cualquier indice en cualquier esquema.
</blockquote>
<p class="definicion" align="justify">
- Procedimientos
</p>
<blockquote>
CREATE PROCEDURE: crear procedimientos en su esquema. <br />
[CREATE|ALTER|DROP] ANY PROCEDURE: permite crear o modificar o borrar cualquier procedimiento en cualquier esquema.<br />
EXECUTE PROCEDURE: permite ejecutar cualquier procedimiento.
</blockquote>
<p class="definicion" align="justify">
- Perfiles
</p>
<blockquote>
[CREATE|ALTER|DROP] PROFILE] permite crear o modificar o borrar perfiles.
</blockquote>
<p class="definicion" align="justify">
- Secuencias
</p>
<blockquote>
CREATE SEQUENCE <br />
[CREATE|ALTER|DROP|SELECT] ANY SEQUENCE
</blockquote>
<p class="definicion" align="justify">
- Sesiones
</p>
<blockquote>
CREATE SESSION: permite al usuario conectarse a la base de datos.<br />
ALTER SESSION: permite ejecutar este comando.<br />
RESTRICTED SESSION: permite al usuario iniciar sesion en modo restringido.<br />
</blockquote>
<p class="definicion" align="justify">
- Tablas
</p>
<blockquote>
[CREATE|ALTER|DELETE|LOCK|FLASHBACK] ANY TABLE
</blockquote>
<p class="definicion" align="justify">
- Tablespaces
</p>
<blockquote>
[CREATE|ALTER|DROP] ANY TABLESPACE
</blockquote>
<p class="definicion" align="justify">
Otros privilegios de sistema que tal vez nos sean utilies son:
</p>
<blockquote>
- SYSDBA es el privilegio mas importante de todo el sistema, otorgando al usuario las funciones de administrador.<br />

- SYSOPER similar al SYSDBA pero un poco mas limitado.
</blockquote>
<p class="definicion" align="justify">
Para poder asignar privilegios de sistema a un usuario haremos:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
sql>GRANT create user, alter user, drop user TO appl_dba;
</p></pre></blockquote>
<p class="definicion" align="justify">
Para que a su vez un usuario pueda asignar privilegios de sistema tendremos que utilizar WITH ADMIN OPTION.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
sql>GRANT index any table TO appl_dba WITH ADMIN OPTION;
</p></pre></blockquote>
<p class="definicion" align="justify">
ROLES
<br /><br />
Podemos considerar un role como un conjunto de privilegios, de tal forma que si a un usuario le asignamos un role este heredar&aacute; de forma automatica todos los privilegios que almacene ese role.
<br /><br />
- Crear un Role:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
sql> CREATE ROLE MiRole;
</p></pre></blockquote>
<p class="definicion" align="justify">
Podemos optar por asignarle un password al role, para hacer que el usuario tenga que proporcionarlo si quisiese habilitar ese role.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
sql> SET ROLE MiRole IDENTIFIED BY MiPass;
</p></pre></blockquote>
<p class="definicion" align="justify">
- Asignar privilegios a un role:
<br /><br />
Utilizaremos GRANT para asignar un privilegio a un role. Podremos utilizar WITH ADMIN OPTION en el caso que asignemos privilegios de sistema.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
sql> GRANT index any table TO MiRole WITH ADMIN OPTION
</p></pre></blockquote>
<p class="definicion" align="justify">
- Asignar un role a un usuario:
<br /><br />
Para asignar un role a un usuario utilizaremos el comando GRANT.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
sql> GRANT MiRole TO MiUser;
</p></pre></blockquote>
<p class="definicion" align="justify">
- Habilitar y desabilitar roles:
<br /><br />
Podemos habilitar o deshabilitar un determinado role en una sesion. Por defecto en las todas las sesiones se van a activar todos los roles que se listen (separados con comas) en el parametro ROLE_LIST en el fichero de inicio. Para habilitar todos los roles podemos utilizar ALL. 
<br /><br />
Para habilitar un role creado con un password haremos:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
sql>SET ROLE MiRole IDENTIFIED BY "MiPass";
</p></pre></blockquote>
<p class="definicion" align="justify">
Podemos habilitar todos los Role excepto uno:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
sql>SET ROLE ALL EXCEPT "MiRole";
</p></pre></blockquote>
<p class="definicion" align="justify">
Para deshabilitar los roles habilitados en una sesi&oacute;n:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
sql>SET ROLE NONE;
<br /><br />
sql>SET ROLE NONE EXCEPT "MiRole1","MiRole2";
</p></pre></blockquote>
<p class="definicion" align="justify">
7) Una vez creado el usuario, haberle asignado sus tablespace por defecto, otorgarle privilegios y todo lo demas podemos llegar a pensar que ya lo tenemos todo, pero este nuevo usuario va a obtener un error cuando intente crear una tabla. Esto es debido a que es necesario asignarle una cuota de espacion en el tablespace que le hemos asignado. Para hacer esto haremos:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
Sql>CREATE USER chip IDENTIFIED BY "Seek!r3t" QUOTA 100M ON USERS;
</p></pre></blockquote>
<p class="definicion" align="justify">
Una vez creado el usuario, podemos modificar su cuota dentro del tablespace:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
Sql>ALTER USER bart QUOTA UNLIMTED ON USERS;
</p></pre></blockquote>
<p class="definicion" align="justify">
UNLIMTED indica que el usuario podra ocupar el tablespace hasta que este se quede sin especio.
</p>
</div>